Dataformの内蔵GitリポジトリからAPIでcommit履歴を取得してみた
概要
DataformのGitは、
- GitHub・GitLabなどのサードパーティのGitリポジトリを使用する
- Dataform内蔵Gitリポジトリを使用する
という2通りのリポジトリ運用が可能です。今回は(2)のDataform内蔵Gitリポジトリを使用した場合を前提に記事を書いています。
※本記事では読みさすさを考慮して勝手に内蔵Gitリポジトリと呼称しています
内蔵Gitリポジトリの作成方法は以下です。
多くの場合(1)のサードパーティのGitリポジトリを使用する運用をとり、GitHubなどと接続することが多いのではないかと思いますがワークロードによってはサードパーティのGitを使用することができず、内蔵Gitリポジトリを使用せざるおえないケースもあるかもしれません。
しかしながら、DataformのGUIでは利用できるGitの機能が限られています(だいたいpull、push、commit、revert程度です)。
私がDataformのGUIで内蔵Gitを使用していてどうしてもcommit履歴が見たくなったのが本記事の発端です。もし同様に内蔵Gitリポジトリを使用していて、commit履歴を見てみたいという方がいたらぜひ読んでみてください。
この記事に書いてあること
- 内蔵GitリポジトリからAPIでcommit履歴を取得する方法
- 内蔵GitリポジトリからcommitSHAを元にcommit内容を取得すること
内蔵GitリポジトリからAPIでcommit履歴を取得する方法
概要
Dataform APIを使用します。
数あるDataform APIのなかでどのAPIかというと、以下のfetchHistory
APIとなります。
https://dataform.googleapis.com/v1beta1/projects/"プロジェクトID"/locations/"リージョン"/repositories/"リポジトリ名":fetchHistory
本APIはパラメータに以下を指定することもできます(必須ではないです)。
Parameter | 内容 |
---|---|
pageSize | 返すコミットの最大数。未指定の場合、サーバは適切なデフォルト値で返却する |
pageToken | ページ分割された場合のページネーション用トークン。コミット数が多い場合必要になる |
今回はとくにpageSizeやpageTokenは設定せずに叩きます。
叩いてみる
curlコマンドを用いて叩きます。
curl https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:fetchHistory --header "Authorization: Bearer $(gcloud auth print-access-token)"
APIのエンドポイント以外に、gcloudコマンドで設定しているGoogle Cloudアカウントの認証情報から生成したアクセストークンを用いて認証しています。
"Authorization: Bearer $(gcloud auth print-access-token)"
上記コマンドを叩くと、内蔵Gitリポジトリのcommit履歴が返却されます。以下は出力例です。
% curl 'https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:fetchHistory' --header "Authorization: Bearer $(gcloud auth print-access-token)"
{
"commits": [
{
"commitTime": "2024-06-11T10:47:08Z",
"commitSha": "6a286e76c66588abeee0d798205c65933557656b",
"author": {
"name": "根本 夏瑠",
"emailAddress": "mail-address"
},
"commitMessage": "test commit"
},
{
"commitTime": "2024-06-11T10:45:09Z",
"commitSha": "ef5f96452e5a86a5d1b6d634d88197bd8b234882",
"author": {
"name": "根本 夏瑠",
"emailAddress": "mail-address"
},
"commitMessage": "first commit"
},
上記からcommitShaを取得することができるので、commitSHAを元にcommit内容を取得することが別のAPIを用いると可能です(後述です)
内蔵GitリポジトリからcommitSHAを元にcommit内容を取得する
概要
fetchHistory
APIを用いることでcommitSHAを取得することができました。それではcommitSHAをもとにどんなcommitがあったのかを取得してみます。
使用するAPIとしてはreadFile
APIとなります。このAPI、エンドポイントが2つありましてリポジトリ
とワークスペース
の2種類が提供されています。
ただし若干叩き方が異なっております。
種類 | 叩き方 | エンドポイント |
---|---|---|
リポジトリ | ファイルパス、commitSHAを指定 | https://dataform.googleapis.com/v1beta1/{name=projects//locations//repositories/*}:readFile |
ワークスペース | ファイルパス、リビジョンを指定 | https://dataform.googleapis.com/v1beta1/{workspace=projects//locations//repositories//workspaces/}:readFile |
今回はcommitSHAを元に取得したいので、リポジトリの方のreadFile
APIを叩きます。(リポジトリにpushされていない場合のファイル内容確認の時にワークスペース単位の方のAPIを叩くものと考えます)
実際に叩いてみる
curlコマンドを用いて叩きます。
curl "https://dataform.googleapis.com/v1beta1/projects/プロジェクトID/locations/asia-northeast1/repositories/リポジトリ名:readFile?commitSha=commitSHA&path=ファイルパス" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" | jq -r '.contents' | base64 --decode
本APIはGETでのリクエストとなるためクエリストリングにcommitSha
とpath
を指定しています。
commitSha
に関しては、fetchHistoryでわかった値を、path
に関してはワークスペース内の該当ファイルのファイルパスを指定します。(fetchHistoryからはどのファイルをコミットしたかはわからないのでご注意ください)commitShaを指定しなかった場合はHEADの内容が返却されます。
出力例としては以下となります。コミットしたファイル内容がそのまま返却されます。
config {
type: "operations"
}
-- INSERT文を記述
INSERT INTO `test_dataform.test_table` (test_test)
VALUES
(${dataform.projectConfig.vars.compile_val});
基本はfetchHistory
APIを叩いた時と同様ですが、今回はjqでレスポンスをパースしてbase64でデコードしています。
というのも、readFile
APIのファイル内容のレスポンスはbase64でエンコードされているためデコードが必要となっています。
base64のデコードをしない場合は以下のようなレスポンスとなります。
{
"contents": "Y29uZmlnIHsNCiAgdHlwZTogIm9wZXJhdGlvbnMiDQp9DQotLSBJTlNFUlTmlofjgpLoqJjov7ANCklOU0VSVCBJTlRPIGB0ZXN0X2RhdGFmb3JtLnRlc3RfdGFibGVgICh0ZXN0X3Rlc3QpDQpWQUxVRVMNCiAgKCR7ZGF0YWZvcm0ucHJvamVjdENvbmZpZy52YXJzLmNvbXBpbGVfdmFsfSk7"
}
どうでしょうか。特に難しいところもなくcommitShaを元にデータを取得できたかと思います。このあとは、ローカルでdiffを取るなりなんなり好きなように扱えば良いかなと思います。
まとめ
まずは3行まとめです。
- 内蔵GitリポジトリからAPIでコミット履歴、コミット内容を取得できる
- readFile APIにはリポジトリ・ワークスペース単位のAPIが存在する
- readFile APIのファイル内容のレスポンスはbase64でエンコードされている
内蔵GitのGUIでの機能が強化されたら、本記事はお蔵入りかなと思います。(また、そもそもGitHubなどを用いていれば・・・)
とはいえ、内蔵Gitをどうしても使わなければいけない、Dataform APIが大好きな人にはもしかしたら本記事は響くかもしれません。
実際私は、どうしても内蔵Gitリポジトリで過去のコミットを見たかったので色々やってみて本記事の内容で解決しました。もっとスマートな方法もあるかもなので今後も探究していきます。
この記事が、どなたかの心に響いていたら嬉しいです。それではまた。ナマステー